When building software systems, developers address both functional concerns (e.g., the core functions of the system) and non-functional concerns (e.g., security, availability, persistence, logging, etc.). For example, and in the case of web services for modern software systems, non-functional concerns such as security, reliable messaging, performance and availability play a role in the adoption of the service based applications.
In some cases, software systems are developed without fully addressing non-functional concerns. The ability to fully address non-functional concerns requires particular knowledge from different domains and an understanding of the composition and interdependencies between non-orthogonal non-functional concerns. For example, a software systems designer or developer may not necessarily be an expert in all non-functional concerns and might not understand their interdependencies, orders and the effect of different compositions.